#!/bin/bash
# 批量测试IP连通性
usage() {
    echo "用法: $0 <src_ip_list> <dst_ip_list> <port> <protocol>"
    echo "    例如: $0 src_ip_list.txt dst_ip_list.txt 5201 tcp"
    exit 1
}

# 检查脚本参数
if [[ $# -ne 4 ]]; then
    usage
fi

src_ips_file="$1"
dst_ips_file="$2"
port="$3"
protocol="$4"

# 验证协议是否为 tcp 或 udp
if [[ "$protocol" != "tcp" && "$protocol" != "udp" ]]; then
    echo "协议必须是 'tcp' 或 'udp'。"
    usage
fi

# 验证源 IP 地址文件和目标 IP 地址文件是否存在
if [[ ! -f "$src_ips_file" || ! -f "$dst_ips_file" ]]; then
    echo "源 IP 列表文件或目标 IP 列表文件不存在。"
    exit 1
fi

# 读取 IP 地址
src_ips=$(cat "$src_ips_file")
dst_ips=$(cat "$dst_ips_file")

# 启动 IPERF 服务器
start_iperf_servers() {
    local ips="$1"
    for ip in $ips; do
        echo "在 $ip 上启动 iperf 服务器..."
        ./iperf_server_start.sh "$ip" "$port"
    done
}

start_iperf_servers "$dst_ips"
start_iperf_servers "$src_ips"

# 创建标志文件以指示前向测试是否完成
forward_test_flag="forward_tests_completed"

# 执行 IPERF 测试（从源 IP 到目标 IP）
perform_iperf_tests() {
    local src_ips="$1"
    local dst_ips="$2"
    local flag="$3"
    for srcip in $src_ips; do
        for dstip in $dst_ips; do
            if [[ "$srcip" == "$dstip" ]]; then
                continue
            fi
            echo "从 $srcip 到 $dstip 执行 iperf 测试..."
            ./iperf_client_test.sh "$srcip" "$dstip" "$port" "$protocol" 10
        done
    done > "$flag"
}

perform_iperf_tests "$src_ips" "$dst_ips" "$forward_test_flag"

# 等待前向测试完成
while [[ ! -f "$forward_test_flag" ]]; do
    echo "等待前向测试完成..."
    sleep 1
done
rm "$forward_test_flag"

# 执行 IPERF 测试（从目标 IP 到源 IP）
echo "执行反向 IPERF 测试..."
perform_iperf_tests "$dst_ips" "$src_ips" "$forward_test_flag"

echo "IPERF 测试完成。请检查日志中的测试结果。"